package ch.bbcnet.awesomeplayer;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;

public class Table extends JPanel implements MouseListener, ActionListener {
    int tagcheck = -1;
    JMenuItem item3;
    JMenuItem item;
    Wiedergabe w;
    MyTableModel m;
    JTable table;
    Tags t = Tags.getInstance();
    XML xml = XML.getInstance();
    String nowShowing = "musik";
    Gui g;
    MyCellRenderer renderer = new MyCellRenderer();
    public Table(final Wiedergabe w,Gui g) {
        super();
        this.g=g;
        this.w = w;
        setLayout(new BoxLayout(Table.this, BoxLayout.PAGE_AXIS));

        m = new MyTableModel(w);

        table = new JTable(m);
        table.setFillsViewportHeight(true);
        table.addMouseListener(this);
        table.setDefaultRenderer(Object.class,renderer);
        table.getTableHeader().setReorderingAllowed(false);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }
    /**
     * Die Aktuelle Playlist wird entfernt und die neu wird angezeigt. Die Musik
     * von der alten Playlist läuft aber noch weiter.
     * @param a Das 2D-Object-Array von der Playlist
     * @param b Der Name von der Playlist
     * @since AwesomePlayer 0.3
     */
    public void setList(Object[][] a,String b) {
        //aktuelle playlist wird gespeichert für löschen suchen und weitere Funktionen die
        //wissen wollen in welche playlist gerade angezeigt wird.
        nowShowing = b;
        //wieviel hat lieder hat es in der aktuellen wiedergabeliste
        //diese in einer rücklaufender for-schlaufe removen
        int at = (m.getRowCount()) - 1;
        for (int i = at; i > -1; i--) {
            m.removeValue(i);
        }
        //aus der übergaba a wird die neue playlist gemacht
        //wenn sie aber nichts beinhaltet wird nichts gemacht
        if (a.length != 0) {
            String[][] playlist = new String[a.length][a[0].length];
            for (int i = 0; i < a.length; i++) {
                for (int r = 0; r < a[0].length; r++) {
                    playlist[i][r] = a[i][r].toString();
                }
                //eine zeile wird hinzugefügt und die ganze liste wird aktualisiert
                m.data.add(playlist[i]);
                m.fireTableRowsInserted(at, at);
                
            }
        }
        this.updateUI();
    }
    public String getNowShowing(){
        return nowShowing;
    }
    /**
     * 
     * @param a new Color for every Second row
     * @since AwesomePlayer 0.6
     */
    public void setColor(Color a){
        renderer.setColor(a);
        this.updateUI();
    }
    
    @Override
    public void mouseClicked(MouseEvent me) {
        if (me.getButton() == 3) {
            
        }
        if (me.getSource() == table) {
            if (me.getClickCount() == 2 & me.getButton() == 1) {
                //Überprüfen ob die Playliste geänder hat
                boolean changed = true;
                String[] tmp_ = new String[m.data.size()];
                for (int i = 0; i < m.data.size(); i++) {
                    tmp_[i] = m.data.get(i)[4];
                }
                if (Arrays.deepEquals(tmp_, w.getPlaylist())) {
                    changed = false;

                }
                if (changed == false) {
                    //checker muss umbedingt auf true gesetzt werden da wenn er auf true
                    //ist wird der event MEDIA.STOPPED nicht ausgeführt!
                    //was wir wollen da sonst zuzätzlich noch ein lied gespult wird.
                    //er wird automatisch in der wiedergabe klasse wieder false gestellt.
                    w.setChecker(true);
                    //isPlaying wird bei Doppelklick auf ein file true gesetzt
                    //sonst würde es bei einem pausiertem doppelklick nicht gehen
                    w.setIsPlaying(true);
                    //file wird abgespielt
                    w.playThis(table.getSelectedRow());
                } else {
                    //die Playlist hat geändert. Somit muss sie der Wiedergabe
                    //neu gesetz werden
                    String[] newPath = new String[m.data.size()];
                    for (int i = 0; i < m.data.size(); i++) {
                        newPath[i] = m.data.get(i)[4];
                    }
                    w.setPlaylist(newPath);
                    w.setChecker(true);
                    w.setIsPlaying(true);
                    w.playThis(table.getSelectedRow());
                }
            }
        }

        if (me.getClickCount() == 1 & me.getButton() == 3) {
                    JPopupMenu menu = new JPopupMenu();
                    item = new JMenuItem("Tags setzen");
                    item.addActionListener(this);

            menu.add(item);
            
            int[] sel = table.getSelectedRows();
            boolean do_or_not = true;
            for(int i=0;i<sel.length&&do_or_not==true;i++){
                if(sel[i]==table.rowAtPoint(me.getPoint())){
                    do_or_not=false;
                }
            }
            if(do_or_not){
                table.changeSelection(table.rowAtPoint(me.getPoint()), table.rowAtPoint(me.getPoint()), false, false);
            }
            if(xml.getPlaylists().length-1>0){
                
            }
            JMenuItem item2 = new JMenu("Hinzufügen zu...");
            item3 = new JMenuItem("Löschen");
            item3.addActionListener(this);
            XML xml = XML.getInstance();
            String[] listen = xml.getPlaylists();
            if(!g.eingeloggtAls.equals("")){
                String[] privateList = xml.getLockedPlaylists(g.eingeloggtAls);
                
                String[] tmp = listen;
                String[] tmp_ = privateList;
                int sum = tmp.length+tmp_.length;
                String [] finalEdition = new String[sum];
                for(int i=0;i<tmp.length;i++){
                    finalEdition[i] = tmp[i];
                }
                for(int i=tmp.length;i<finalEdition.length;i++){
                    finalEdition[i] = tmp_[i-tmp.length];
                }
                listen = finalEdition;
                
            }
            
            for (int i = 0; i < listen.length; i++) {
                if(listen[i].equals("musik")==false && listen[i].equals(nowShowing)==false){
                    JMenuItem tmpo = new JMenuItem(listen[i]);
                    tmpo.setName(listen[i]);
                    item2.add(tmpo);
                    tmpo.addActionListener(this);
                }

            }
            item.addActionListener(this);
            menu.add(item2);
            menu.add(item3);
            menu.show((JTable) me.getSource(), me.getX(), me.getY());
            table.revalidate();
            table.updateUI();
        }


    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource().toString().contains("JMenuItem") && ae.getSource() != item3 && ae.getSource() !=item) {
            JMenuItem parent = (JMenuItem) ae.getSource();
            String playlist = parent.getText();
            
            int[] selected = table.getSelectedRows();
            Object[][] add = new Object[selected.length][5];
            for (int i = 0; i < selected.length; i++) {
                Object[] tmp = (Object[]) m.data.get(selected[i]);
                add[i] = tmp;
                
            }
            //XML braucht eine andere Reihenfolge da es sonst falsch gespeichert wird.
            //hier wird die Liste umgestellt
            for(int i=0;i<add.length;i++){
                Object tmp_1 = add[i][0];
                Object tmp_2 = add[i][1];
                add[i][1] = add[i][2];
                add[i][0] = tmp_2;
                add[i][2] = tmp_1;
            }
            xml.addToPlaylist(playlist, add);
            this.setList(xml.getData(this.nowShowing), nowShowing);
            g.manuelSearch();
        }
            
            
        else if(ae.getSource() == item3){
            
            int[] selected = table.getSelectedRows();
            Object[] sto = new Object[table.getSelectedRowCount()];
            
            for(int i=0;i<selected.length;i++){
                sto = (Object[]) m.data.get(selected[i]);
                xml.deleteFromPlaylist(nowShowing, sto);
            }
            
            setList(xml.getData(nowShowing),nowShowing);
            
        } else if (ae.getSource() == item){
            int[] tbls = (table.getSelectedRows());
                String[][] tmp = new String[m.data.size()][5];
                File[] file_ = new File[m.data.size()];

                String[] Names = new String[tbls.length];
                String[] Autors = new String[tbls.length];
                String[] Albums = new String[tbls.length];
                String[] Genres = new String[tbls.length];
                String[] Paths = new String[tbls.length];
                
                for(int i = 0;i<tbls.length;i++){
                    tmp[i] = m.data.get(tbls[i]);
                    file_[i] = new File(tmp[i][4]);
                    Names[i] = t.getTitel(file_[i]);
                    Albums[i]= t.getAlbum(file_[i]);
                    Autors[i] = t.getArtist(file_[i]);
                    Genres[i] = t.getGenre(file_[i]);
                    Paths[i] = tmp[i][4];
                }
                tagcheck++;
                if(tagcheck%2==0){
                    new Tagaendern(this,Names,Autors,Albums,Genres,Paths);
                }
        }
    }

    class MyTableModel extends AbstractTableModel {

        private XML xml = XML.getInstance();
        private String[] columnNames = xml.getColumnNames();
        public ArrayList<String[]> data = new ArrayList();
        private Wiedergabe w;

        public MyTableModel(Wiedergabe w) {
            //Statet man das Programm ist Defaultmässig immer die Musik offen
            //dort befinden sich alle Musikstücke
            this.w = w;
            String[][] playlist;
            Object[][] geted = xml.getData("musik");
            //Überprüfen ob die liste leer ist
            //denn sonst gibts list index out of bounds
            if (geted.length != 0) {
                String[] onlyPath = new String[geted.length];
                playlist = new String[geted.length][geted[0].length];
                for (int i = 0; i < geted.length; i++) {
                    for (int r = 0; r < geted[0].length; r++) {
                        playlist[i][r] = geted[i][r].toString();
                    }
                    data.add(playlist[i]);
                    onlyPath[i] = geted[i][4].toString();
                }
                this.w.setPlaylist(onlyPath);
            }

        }

        public void removeValue(int index) {
            data.remove(index);
        }

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public int getRowCount() {
            return data.size();
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            String[] a = (String[]) data.get(row);
            return a[col];
        }

        @Override
        public Class<String> getColumnClass(int c) {
            return String.class;
        }
    }
}
